package test.zdx.数组;

import java.util.Arrays;

public class 数组类方法测试
{
    public static void main(String[] args)
    {
        int[] ints = {1, 4, 3, 3, 2, 2, 3, 1, 0, 2, 4};

        Arrays.sort(ints);//静态方法，类方法对数组直接进行排序
//——————————————打印数组————————————————//
        System.out.println(ints);//打印出来的是存在栈上的引用变量的地址
        //[I@7a0ac6e3  而且此地址是经过哈希码处理的
        //Java的安全性是处理的比较不错的，用户拿不到数组元素的地址
        //拿到的数组引用变量的地址也是经过处理过的
        System.out.println(Arrays.toString(ints));
        //输出结果：[0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4]
        //toString方法返回值是包含数组所有元素内容的字符串
        //打印出来数组，还有一种方法foreach遍历打印
        //如下：
        for(int i : ints)
        {
            System.out.print(i+" ");
        }//输出结果：0 1 1 2 2 2 3 3 3 4 4
        System.out.println();

//——————————数组中的二分查找方法————————————//
        System.out.println(Arrays.binarySearch(ints, 1, 2, 5));
//注意调用二分查找方法时，
/*需要注意如下三点。1，必须是升序排列的数组（大于等于）
                            此外补充一点,在刷题过程中，我们通常遇到两种情况，一，要求你返回数组内的元素，具体的值
                            要么就是要求你返回数组的索引值（下标）
                            当要求你返回的是索引值的时候，数组百分之九十九九九是动不了的
                            但是要求返回具体值的时候，通常sort一下，题目的可操作性更高。
                             static void sort(int[] a, int left, int right,
                     int[] work, int workBase, int workLen) {
        // Use Quicksort on small arrays
        if (right - left < QUICKSORT_THRESHOLD) {
            sort(a, left, right, true);
            return;
        }
       这是sort的部分源码，官方的sort效率很高，但是面试和做题的时候看清题目要求，快排往往操作效率不稳定，有时候数组有序反而退化成冒泡排序
       底层是quickSort的改进
       有些题目要求时间复杂度有要求

       2、二分查找，使用系统Arrays类里面的类方法时，记得它的返回值，如果不存在时，只是返回一个负数表示非法下标不存在，如题目有要求，建议处理一下返回值为-1
       3、如果是对数组中部分进行排序且包含数组的最后一个，由于二分查找的范围是左闭右开的，在右边具有排他性
       为了防止数组下标越界和漏掉最后一个数这种情况，最好手撕binarySearch

*/
        int[] newArr = Arrays.copyOf(ints, 15);
        int[] newArr1024 = Arrays.copyOf(ints, 5);
        System.out.println(Arrays.toString(newArr1024));
        //按照新长度复制新数组并且扩容。多补0，少的不要
        System.out.println(Arrays.toString(newArr));
        System.out.println("原数组的长度是"+ints.length);
        //获取数组的长度 不同于 获取字符串的长度的 方法
        //字符串的数组长度的方法为 字符串名.length（）方法;
        String string = "HelloWorld";
        int strLen = string.length();//这里的查询长度的方法是对象方法，必须是实例化后的对象（字符串）
        //能以对象名（字符串名）加 点 调用
        //而数组中的长度，是一个常量，在你声明数组的时候，因为数组的长度已经写死了，无法再改变了。
        //这个对象内的数据域（属性）         //0_Array__ public final int length 此处注意
        Arrays.fill(newArr, 11, 12, 5);
        System.out.println(Arrays.toString(newArr));
        Arrays.fill(newArr, 12, 13, 6);
        System.out.println(Arrays.toString(newArr));
        Arrays.fill(newArr, 13, 15, 7);//在此注意fill方法填充不能越界
        System.out.println(Arrays.toString(newArr));
        Arrays.fill(newArr, 0, 15, 1024);//在此注意fill方法填充不能越界
        System.out.println(Arrays.toString(newArr));
        int[] ints1 = Arrays.copyOfRange(newArr, 0, 5);
        System.out.println(Arrays.toString(ints1));

        int[] ints2 = {1, 23, 4};
        int[] ints3 = {1, 23, 4};
        int[] ints4 = ints2;
        System.out.println(Arrays.equals(ints2, ints3));
        System.out.println(Arrays.equals(ints2, ints4));
        System.out.println(ints2 == ints3);
        System.out.println(ints2 == ints4);
//java中双等号的作用是判别身份
        //身份相同的，内容自然相同
        //单纯判断内容，常用equals方法！~

    }
}
